package org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista.habilidad;

import java.util.ArrayList;

import org.javahispano.javacup.modelo.Comando;
import org.javahispano.javacup.modelo.ComandoIrA;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista.Futbolista;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista.FutbolistaBase;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista.Oponente;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista.Rol;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.util.Balon;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.util.PosicionCampo;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.util.PosicionFutura;

/**
 * @author Joan Crosas
 *
 */
public class InterceptarBalon implements Habilidad {

	private Futbolista futbolista;
	
	/**
	 * 
	 */
	public InterceptarBalon( Futbolista futbolista ) {
		this.futbolista = futbolista;
	}

	@Override
	public boolean ejecutar() {
		
		Futbolista futbolistaMasCercano = futbolista.getVisionPartido().futbolistaMasCercanoBalon();
		Futbolista futbolistaBalonControlado = futbolista.getVisionPartido().futbolistaBalonControlado();
		ArrayList<Futbolista> futbolistasInterceptanBalon = futbolista.getVisionPartido().futbolistasPuedenInterceptarBalon();
		
		PosicionFutura posicionIntercepcionBalon = futbolista.puedoInterceptarBalon();
		Balon balon = futbolista.getVisionPartido().getBalon();
		Oponente oponenteInterceptaBalon = futbolista.getVisionPartido().oponentePuedeInterceptarBalon();
		int tiempoInterceptanOtros = Integer.MAX_VALUE;
		
		if( oponenteInterceptaBalon != null ) {
			PosicionFutura posicionIntercepcionBalonOponente = oponenteInterceptaBalon.puedoInterceptarBalon();
			tiempoInterceptanOtros = posicionIntercepcionBalonOponente.getTiempo();
		}
		if( futbolistasInterceptanBalon.size() > 0 ) {
			PosicionFutura posicionIntercepcionBalonMejorFutbolista = futbolistasInterceptanBalon.get(0).puedoInterceptarBalon();
			if( posicionIntercepcionBalonMejorFutbolista != null && posicionIntercepcionBalonMejorFutbolista.getTiempo() < tiempoInterceptanOtros ) {
				tiempoInterceptanOtros = posicionIntercepcionBalonMejorFutbolista.getTiempo();
			}
		}
		
		
		
		// si lo puedo interceptar: voy a por el balon
		if( posicionIntercepcionBalon != null && posicionIntercepcionBalon.getTiempo() < tiempoInterceptanOtros  ) {
			Comando comando = new ComandoIrA( futbolista.getIndice(), posicionIntercepcionBalon.setDentroCampoJuego().toPosicion() );
			futbolista.getVisionPartido().addComando( comando );
			
		} else if( posicionIntercepcionBalon != null && futbolistasInterceptanBalon.contains( futbolista ) ) { 
			
			// evitamos que un defensa deje libre a un oponente
			if( futbolista.getRol() == Rol.DEFENSA && futbolista.getOponenteAsignado() != null && !futbolista.getVisionPartido().saco() ) {
				return false;
			}
			
			// si el enemigo controla el bal�n intentamos bloquear la porteria
			if( futbolista != futbolistaMasCercano &&
					futbolista != futbolistaBalonControlado && 
					oponenteInterceptaBalon != null && 
					oponenteInterceptaBalon.puedoInterceptarBalon().getTiempo() < posicionIntercepcionBalon.getTiempo() ) {
				
				double anguloPorteria = futbolista.getAnguloPorteria();
				double anguloPosicionIntercepcion = futbolista.getPosicion().angulo( posicionIntercepcionBalon );
				double distancia = futbolista.getPosicion().distancia( posicionIntercepcionBalon );
				
				PosicionCampo posicionDefensa = futbolista.getPosicion().moverAngulo( anguloPorteria, distancia/2 );
				posicionDefensa = posicionDefensa.moverAngulo( anguloPosicionIntercepcion, distancia );
				
				Comando comando = new ComandoIrA( futbolista.getIndice(), posicionDefensa.setDentroCampoJuego().toPosicion() );
				futbolista.getVisionPartido().addComando( comando );
				

			} else {
				// hacemos cumplir la distancia min pase de pase si el que esta mas cerca del bal�n
				// es uno de nuestros futbolistas
				if( ( futbolistaBalonControlado != null && futbolistaBalonControlado != futbolista ) ) {
					// hacemos respetar la distancia minima
					double angulo = balon.getPosicionBalon().angulo( futbolista.getPosicion() );
					posicionIntercepcionBalon = posicionIntercepcionBalon.moverAngulo( angulo, FutbolistaBase.DISTANCIA_MIN_PASE + 3 );
					futbolista.resetPuedoInterceptarBalon();
				}
				
				Comando comando = new ComandoIrA( futbolista.getIndice(), posicionIntercepcionBalon.setDentroCampoJuego().toPosicion() );
				futbolista.getVisionPartido().addComando( comando );
				
			}
			
			
			
		} else if( futbolistaMasCercano == futbolista ) { // si soy el mas cercano: voy a por el balon
			Comando comando = new ComandoIrA( futbolista.getIndice(), balon.getPosicionBalon().toPosicion() );
			futbolista.getVisionPartido().addComando( comando );
		}
		
		return false;
	}


}
